package com.li.util;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class TokenUtil {
    /**
     * 过期时间
     */
    private static final long EXPIRE_TIME = 15 * 60 * 1000;
    /**
     * token秘钥
     */
    private static final String TOKEN_SECRET = "c369a1e4-43ee-4e1e-b130-2b952f1ba9ad";

    /**
     * 签名方法
     * @Param userName  userName
     * @Param role  role
     * @return String role
     */
    public static String getToken(String userName, String uid) {
        log.info("sign begin.");
        try {
            // 过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            // 秘钥和加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // headers
            Map<String, Object> herders = new HashMap<>(2);
            herders.put("typ", "JWT");
            herders.put("alg", "HS256");
            log.info("sign end.");
            return JWT.create()
                    .withHeader(herders)
                    .withClaim("username", userName)
                    .withClaim("uid", uid)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception exception) {
            exception.printStackTrace();
            log.info("sign error.");
            return exception.getMessage();
        }
    }

    /**
     * token 校验方法
     * @Param userName  userName
     * @return String role
     */
    public static boolean verify(String token) {
        log.info("verify begin.");
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();

            verifier.verify(token);
            log.info("verify end.");
            return true;
        } catch (Exception exception) {
            log.info("verify error.");
            exception.printStackTrace();
            return false;
        }
    }
}


/*
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.li.pojo.User;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class TokenUtil {
    // 秘钥，你可以随便取，可以取的难一点
    public static final String SECRET = "ASD!@#F^%A";

    public void testTokenCreate(User user) {
        HashMap<String, Object> headers = new HashMap<>();
        // 过期时间，一天
        Calendar expires = Calendar.getInstance();
        expires.add(Calendar.SECOND, 60*60*24);

        String jwtToken = JWT.create()
                // 第一部分Header
                .withHeader(headers)
                // 第二部分Payload
                .withClaim("username", user.getUsername())
                .withClaim("userId", user.getUid())
                .withExpiresAt(expires.getTime())
                // 第三部分Signature
                .sign(Algorithm.HMAC256(SECRET));
        System.out.println("创建token"+jwtToken);
    }
//    public void testReadJWT() {
//        // 创建一个验证的对象
//        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
//        DecodedJWT verify = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6IkxKSiIsImV4cCI6MTY2NzcyMTMzMiwidXNlcklkIjoyMH0.AJA88B0F-zKEJUCIGp9kSx2TlbpoyH88GzEn-9xN5XI");
//        System.out.println(verify.getClaim("userId").asInt());
//        System.out.println(verify.getClaim("userName").asString());
//        System.out.println("过期时间：" + verify.getExpiresAt());
//    }
//    SignatureVerificationException：签名不一致。
//    TokenExpiredException：令牌过期。
//    AlgorithmMismatchException：算法不匹配异常。
//    InvalidClaimException：失效的Payload异常。一般存在于这种情况：获取token的服务器比使用token的服务器时钟快，请求分发到时间慢的服务器上导致token还没生效

}
*/